#include <ioCC2530.h> //引用 CC2530 头文件
#define SW1 P1_2      //宏定义，如下是LED宏定义
#define LED1 (P1_0)   //宏定义，LED1，简单好写。
#define LED2 (P1_1)   //宏定义，LED2，简单好写.
unsigned int t3_Count=0;        //定时器3溢出次数计数。

#pragma vector = T3_VECTOR
__interrupt void T3_INT(void)
{
  IRCON = 0x00;      //清理中断标志，也可以通过硬件自清理。这一行去查看ioCC2530的Interrupt Flags 4
  t3_Count++;        //t3，使用int整数型。
/*if(t3_Count == 245)//测试code，0.5秒。没啥用了现在。
  {
    LED2=1;
  }
  if(t3_Count == 490)//同样测试code。1秒。
  {
    LED2=0;
    t3_Count=0;
  }
*/
}

void initUART0(void)
{
  PERCFG=0x00;
  P0SEL=0x3c;         //启动P0.2 P0.3 P0.4 P0.5作为外设IO口。第五单元PDF有详细介绍。
  U0CSR|=0x80;        //11110000 UART mode+禁止接收器+SPI 从
  U0UCR|=0x80;        //11110000 清除单元 +禁止流控制+奇校验+8位传送禁9位+1停止位低电平
  U0BAUD=216;         //U0BAUD.BAUD_M = 216 
  U0GCR=10;           //U0GCR.BAUD_M = 10 如上对应CC2530串行通信波特率 设置为57600 误差0.03%
  UTX0IF=0;           //清零UART0TX中断标志
  EA = 1;             //使能中断
}

void UART0SendByte(unsigned char c)
{
  U0DBUF = c;       // 将要发送的 1 字节数据写入 U0DBUF
  while (!UTX0IF);  // 等待 TX 中断标志，即 U0DBUF 就绪
  UTX0IF = 0;       // 清零 TX 中断标志
}

void UART0SendString(unsigned char *str)
{
  while(*str != '\0')
  {
    UART0SendByte(*str++); // 发送字节数据
  }
}

void initTimer1()
{
  CLKCONCMD &= 0x80;                //时钟速度设置为 32MHz
  T3CCTL0 =50000 & 0xFF;            //把 50000 的低 8 位写入 T3CCTL0 /*  Timer 3 Channel 0 Capture/Compare Control          */
  T3CC0 =((50000 & 0xFF00) >> 8);   //把 50000 的高 8 位写入 T3CC0   /*  Timer 3 Channel 0 Capture/Compare Value            */
  EA = 1;                           //使能全局中断
  T3CTL |= 0xE0;                    //定时器3 时钟频率128分频 设置最大计数值在此设置。
                                    //推一下我的计算方式吧，因为我这一次跟老师不一样。
                                    //首先，128分频,128/16000000*N=0.5S,N=62500
  T3IE = 1;                         //使能定时器3      总中断                                  
  T3CCTL0 |= 0x08;                  //使能定时器3通道1 溢出中断
  T3CCTL0 &= ~0x03;                 //定时器3通道1 采用 自由mode
                                    //00->0xff 62500/255=245次。此时245次为0.5秒。
  T3CTL |= 0x10;                    //启动 关键code 全局启动
}

/***************************************************************************************************************
本次1.5.2020.1224.5-2Code版本，代码和写法均来自第五单元.pdf和CC2530中文数据手册完全版和头文件.
                               第五单元.pdf                 
                               ioCC2530.h                   C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\bin
                               本次新增T3计时器写UART串口通信法。可以作为参考和模仿文件。
                               后续可能会上传更完善的模仿文件请大家关注。
                               我记得没错的话，很早前我说过T3计时器和T4计时器写法很相似的。其实不妨，按照我大概，其实修改几个字母几个字符，T4计时器就能用了。
                               当然，代码可能还会存在一些某些场景出现的BUG（光是软件Rubild All后其实看不出来的）
                               所以，还是请大家认真使用，计时器看需使用。使用教程其实注释变相的写了。
                               废话不多说，把代码远程git下来，开始你们的C之旅吧！
                               欢迎大家认真使用，本代码已经同步至GITEE仓库，遵守BY-NC-SA4.0协议，转载请署名。
***************************************************************************************************************/

void main(void) 
{
  /*LED1 LED2设置普通IO输出口完毕*/
  LED1 = 0;
  LED2 = 0;
  P1SEL &= ~0x03;     //设置P1.0和P1.1为普通IO口。P1.0 P1.1为LED
  P1DIR |= 0x03;      //设置P1.0和P1.1为输出口。  P1.0 P1.1为LED
  /*调用函数 initTimer1 initUART0 也已经完成初始化设置*/
  initTimer1();       //初始化如上函数，EA全局使能中断可以在这里写。
  initUART0();        //初始化如上上函数
  
  while(1)
  { 
    //设置发送已经设定好的数据,目前已经注释,无需使用**
    if(t3_Count>=1470)  //
    {
      LED1 = 1;
      UART0SendString("浩瀚银河 https://www.haohanyh.com ");
      LED1 = 0;
      LED2 = 1;
      UART0SendString("旨在于提供计算机软硬件的方方面面文章 \n");
      LED2 = 0;
      t3_Count = 0;
    }
    //设置接收,以下代码为第一题*/
  }
}
